package XML与JSON.使用SAX;

import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import javax.xml.XMLConstants;
import javax.xml.transform.sax.SAXSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

//该示例使用users.xsd模式来验证users.xml文件。
public class xml文件xsd验证 {

    public static void main(String[] args) {

        File xsdFile = new File("src\\main\\java\\XML与JSON\\使用SAX\\users.xsd");

        try {

            Path xmlPath = Paths.get("src\\main\\java\\XML与JSON\\使用SAX\\users.xml");
            Reader reader = Files.newBufferedReader(xmlPath);

            //使用SchemaFactory，我们为我们的模式定义选择 W3C XML 模式。 换句话说，我们的自定义架构定义还必须遵守某些规则。
            String schemaLang = XMLConstants.W3C_XML_SCHEMA_NS_URI;
            SchemaFactory factory = SchemaFactory.newInstance(schemaLang);
            Schema schema = factory.newSchema(xsdFile);

            //从架构生成一个新的验证器。
            Validator validator = schema.newValidator();

            //我们根据提供的模式验证 XML 文档。
            SAXSource source = new SAXSource(new InputSource(reader));
            validator.validate(source);

            System.out.println("The document was validated OK");
            
        //默认情况下，如果文档无效，则抛出SAXException。
        //等级分类有 （TRACE < DEBUG < INFO < WARN < ERROR）
        } catch (SAXException ex) {
            Logger lgr = LoggerFactory.getLogger(xml文件xsd验证.class.getName());
            lgr.info("The document failed to validate");
            lgr.info(ex.getMessage(),ex);
        } catch (IOException ex) {
      	  Logger lgr = LoggerFactory.getLogger(xml文件xsd验证.class.getName());
      	  lgr.info("The document failed to validate");
           lgr.info(ex.getMessage(), ex);
        }
    }
}



